package com.factors.DaiGuiCheng.aveStudyTime;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

import java.util.HashMap;

public class Comparator extends Partitioner<Text, IntWritable> {


    public  static HashMap<String,Integer> stateMap= new HashMap<String, Integer>();
    static {
        stateMap.put("0~10",0);
        stateMap.put("11~20",1);
        stateMap.put("21~30",2);
        stateMap.put("31~45",3);

    }

    /**
     * 自定义分区器中分区规则的实现方法。
     * 根据年龄值将数据分为三个区间：1-60、61-80、81-100。
     *
     * @param key 输入键 (Text 类型)
     * @param value 输入值 (Text 类型，包含年龄信息)
     * @param numReduceTasks Reducer 的总数
     * @return 分区号 (int 类型)
     */
    @Override
    public int getPartition(Text key, IntWritable value, int numReduceTasks) {
        // 假设 age 是 value 字符串中的第一个字段，用逗号分隔
        String[] fields = key.toString().split(",");
        if (fields.length > 0) {
            try {
                int stime = Integer.parseInt(fields[0].trim());

                // 根据年龄划分区间
                if (stime >= 0 && stime <= 10) {
                    return 0; // 第一个区间
                } else if (stime >= 11 && stime <= 20) {
                    return 1; // 第二个区间
                } else if (stime >= 21 && stime <= 31) {
                    return 2; // 第三个区间
                }else if (stime >= 31 && stime <= 45){
                    return  3;
                }
            } catch (NumberFormatException e) {
                // 如果年龄字段不是有效的整数，处理异常情况
                System.err.println("Invalid age format: " + fields[0]);
            }
        }

        // 对于不符合条件或解析失败的情况，返回默认分区号
        return numReduceTasks - 1; // 默认分到最后一个 Reducer
    }
}
